/******************************************************************************* * Copyright (c) 2009, 2011 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.ant.internal.ui; import org.eclipse.ant.internal.core.IAntCoreConstants; import org.eclipse.ant.internal.ui.preferences.AntObjectLabelProvider; import org.eclipse.jface.viewers.ColumnViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerComparator; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.widgets.TableColumn; /** * A sorter that can be attached to a given column in a given viewer. This comparator uses the {@link AntObjectLabelProvider} to get the text to * compare * * @since 3.5 */ public abstract class ColumnSorter extends ViewerComparator { private ColumnViewer cviewer = null; private TableColumn column = null; private int direction = SWT.DOWN; private int columnidx = 0; /** * Constructor * * @param cviewer * @param column */ public ColumnSorter(ColumnViewer cviewer, TableColumn column) { this.cviewer = cviewer; this.column = column; this.columnidx = getColumnIndex(); this.column.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (ColumnSorter.this.cviewer.getComparator() != ColumnSorter.this) { setDirection(SWT.DOWN); } else { int tdirection = ColumnSorter.this.column.getParent().getSortDirection(); if (tdirection == SWT.NONE) { setDirection(SWT.DOWN); } else { setDirection(tdirection == SWT.UP ? SWT.DOWN : SWT.UP); } } } }); } /** * Returns the compare text that should be used for the given object coming from the given column index * * @param obj * @param columnindex * @return the text to compare with */ public abstract String getCompareText(Object obj, int columnindex); /** * Sets the sorting direction for this sorter to use * * @param direction */ public void setDirection(int direction) { this.column.getParent().setSortColumn(this.column); this.direction = direction; this.column.getParent().setSortDirection(this.direction); if (this.cviewer.getComparator() == this) { this.cviewer.refresh(); } else { this.cviewer.setComparator(this); } } /** * @see org.eclipse.jface.viewers.ViewerComparator#compare(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object) */ @Override public int compare(Viewer viewer, Object e1, Object e2) { String text1 = getCompareText(e1, this.columnidx); if (text1 == null) { text1 = IAntCoreConstants.EMPTY_STRING; } String text2 = getCompareText(e2, this.columnidx); if (text2 == null) { text2 = IAntCoreConstants.EMPTY_STRING; } return (this.direction == SWT.UP ? -1 : 1) * text1.compareTo(text2); } /** * Returns the index of the given column in the backing table for this page, or 0 * * @return the index of the column in the backing table for this page or 0 */ private int getColumnIndex() { int idx = this.column.getParent().indexOf(this.column); return (idx < 0 ? 0 : idx); } }